﻿//-------------------------------------------------------------------
//	Copyright (c) 2010-2014  Zhirnov Andrey
//	This file is part of the "UX Standard Lib" project.
//	See copyright notice in "UX_Logger.h".
//-------------------------------------------------------------------

#include "CLogFileOutput.h"

namespace UX_STL
{
namespace UXLogger
{
	
	static const char	* p_colors[] = { /*0-black*/	"#000000",	/*1-grey*/	"#646464",	/*2-silver*/"#C0C0C0",
										 /*3-limegreen*/"#32CD32",	/*4-green*/	"#688E23",	/*5-blue*/	"#0000FF",
										 /*6-navy*/		"#000080",	/*7-gold*/	"#FFD700",	/*8-orange*/"#FF4500",
										 /*9-red*/		"#AA0000",	/*a-violet*/"#8A2BE2",	/*b-olive*/	"#808000" };

#	ifndef NEWLINE
#		define _NEWLINE_DEFINED_IN_LOG
#		define NEWLINE	"\n"
#	endif


//-------------------------- CTxtLogOutput ------------------------//
/*
=================================================
	конструктор
=================================================
*/
	CTxtLogOutput::CTxtLogOutput(WFilePtr pFile): _pFile(pFile)
	{}

/*
=================================================
	деструктор
=================================================
*/
	CTxtLogOutput::~CTxtLogOutput()
	{
		_Flush( string("Log closed.") << NEWLINE );
		_pFile = null;
	}
	
/*
=================================================
	записать строку в файл
=================================================
*/
	inline void CTxtLogOutput::_Flush(const string &s)
	{
		_pFile->Write( s.cstr(), s.Length() );
	}

/*
=================================================
	запись строки в лог
=================================================
*/
	void CTxtLogOutput::Write(const char *pMsg, e_log_msg::type eType, const char *pSrcFile, uint uLine)
	{
		string	s_mes;

		if ( EnumCmp( eType, e_log_msg::_LMPX_TIME ) )
		{
			TPlatform::GetDate( s_mes, e_date::TIME_MSEC );
			s_mes << " - ";
		}
		
		_AddPrefix( s_mes, eType & e_log_msg::_LMP_MASK );
		s_mes << pMsg;
		
		if ( EnumCmp( eType, e_log_msg::_LMPX_FILE_LINE ) and pSrcFile != null and uLine != -1 )
			s_mes << " (file: \"" << pSrcFile << "\", line: " << uLine << ")";
		
		s_mes << NEWLINE;

		_Flush( s_mes );
	}

/*
=================================================
	вставить пустую строку в лог
=================================================
*/
	void CTxtLogOutput::NewLine()
	{
		_Flush( NEWLINE );
	}

/*
=================================================
	удалить
=================================================
*/
	void CTxtLogOutput::Free()
	{
		delete this;
	}

/*
=================================================
	добавить приставку к строке
=================================================
*/
	inline void CTxtLogOutput::_AddPrefix(string &str, e_log_msg::type ePrefix)
	{
		switch ( ePrefix )
		{
			case e_log_msg::_LMP_INFO	 :
			case e_log_msg::_LMP_NONE	 :		return;
			case e_log_msg::_LMP_WARNING :		str << "[WARNING] ";	break;
			case e_log_msg::_LMP_ERROR	 :		str << "[ERROR]   ";	break;
			case e_log_msg::_LMP_FATAL	 :		str << "[FATAL]   ";	break;
			case e_log_msg::_LMP_DEBUG	 :		str << "[DEBUG]   ";	break;
			case e_log_msg::_LMP_SYSTEM	 :		str << "[SYSTEM]  ";	break;
			case e_log_msg::_LMP_USER	 :		str << "[USER]    ";	break;
		}
	}



//-------------------------- CHtmlLogOutput -----------------------//
/*
=================================================
	конструктор
=================================================
*/
	CHtmlLogOutput::CHtmlLogOutput(WFilePtr pFile):
		_pFile(pFile), _uCurColor(0)
	{
		_Flush( "<html> <head> <title> log </title> </head> <body BGCOLOR=\"#ffffff\">"\
				"<p><PRE><font face=\"Lucida Console, Times New Roman\" size=\"2\" color=\"#000000\">"NEWLINE );
		_uCurColor	= e_log_msg::_HC_BLACK;
	}

/*
=================================================
	деструктор
=================================================
*/
	CHtmlLogOutput::~CHtmlLogOutput()
	{
		string	str;

		_SetColor( e_log_msg::_HC_BLACK, str );
		
		str << "Log closed.</font></PRE> </p> </body> </html>"NEWLINE;

		_Flush( str );
		_pFile = null;
	}
	
/*
=================================================
	записать строку в лог файл
=================================================
*/
	inline void CHtmlLogOutput::_Flush(const string &s)
	{
		_pFile->Write( s.cstr(), s.Length() );
	}

/*
=================================================
	запись строки в лог
=================================================
*/
	void CHtmlLogOutput::Write(const char *pMsg, e_log_msg::type eType, const char *pSrcFile, uint uLine)
	{
		string	s_mes;
		
		_SetColor( eType & e_log_msg::_HC_MASK, s_mes );

		if ( EnumCmp( eType, e_log_msg::_LMPX_TIME ) )
		{
			TPlatform::GetDate( s_mes, e_date::TIME_MSEC );
			s_mes << " - ";
		}

		s_mes << pMsg;

		if ( EnumCmp( eType, e_log_msg::_LMPX_FILE_LINE ) and pSrcFile != null and uLine != -1 )
			s_mes << " (file: \"" << pSrcFile << "\", line: " << uLine << ")";

		s_mes << NEWLINE;

		_Flush( s_mes );
	}

/*
=================================================
	вставить пустую строку в лог
=================================================
*/
	void CHtmlLogOutput::NewLine()
	{
		_Flush( NEWLINE );
	}

/*
=================================================
	удалить
=================================================
*/
	void CHtmlLogOutput::Free()
	{
		delete this;
	}

/*
=================================================
	изменить цвет шрифта
=================================================
*/
	inline void CHtmlLogOutput::_SetColor(uint uColor, string &str)
	{
		if ( _uCurColor != uColor )
		{
			str << "</font><font color=\"" << p_colors[uColor] << "\">";
			_uCurColor = uColor;
		}
	}
	
#	ifdef _NEWLINE_DEFINED_IN_LOG
#		undef NEWLINE
#	endif

//-------------------------------------------------------------------

}	// UXLogger
}	// UX_STL
